import chain.FaultHandler;
import chain.ObstacleHandler;
import chain.SafetyHandler;
import command.MoveCommand;
import factory.MachineFactory;
import factory.PlanterFactory;
import machine.AgriculturalMachine;
import monitor.EnvironmentMonitor;
import state.MachineState;
import state.WorkingState;
import strategy.NormalPathStrategy;
import strategy.ObstacleAvoidanceStrategy;
import strategy.PathStrategy;

import java.util.Scanner;
// ... 原有导入保持不变 ...

public class Main {
    private static AgriculturalMachine planter;  // 新增：全局农机实例

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        while (true) {  // 新增：菜单循环
            printMenu();
            int choice = getValidChoice(scanner);  // 处理用户输入

            switch (choice) {
                case 1:
                    initMachine();  // 拆分的初始化方法
                    break;
                case 2:
                    environmentMonitorDemo();  // 拆分的环境监测方法
                    break;
                case 3:
                    pathPlanningDemo();  // 拆分的路径规划方法
                    break;
                case 4:
                    safetyChainDemo();  // 拆分的责任链方法
                    break;
                case 5:
                    stateSwitchDemo();  // 拆分的状态切换方法
                    break;
                case 6:
                    controlCommandDemo();  // 拆分的控制命令方法
                    break;
                case 7:
                    show();  // 展示使用的设计模式
                    break;
                case 0:
                    System.out.println("程序已退出");
                    scanner.close();
                    return;
                default:
                    System.out.println("无效输入，请重新选择");
            }
            System.out.println("\n-------------------------\n");  // 分隔线
        }
    }



    // 新增：菜单显示方法
    private static void printMenu() {
        System.out.println("=== 农机管理系统 ===");
        System.out.println("1. 初始化农机");
        System.out.println("2. 环境监测演示");
        System.out.println("3. 路径规划演示");
        System.out.println("4. 安全事件处理链");
        System.out.println("5. 状态切换演示");
        System.out.println("6. 发送控制命令");
        System.out.println("7. 展示使用的设计模式");

        System.out.println("0. 退出系统");
        System.out.print("请输入选项（0-7）: ");
    }

    // 新增：输入验证方法（防止非数字输入）
    private static int getValidChoice(Scanner scanner) {
        while (true) {
            try {
                return Integer.parseInt(scanner.next());
            } catch (NumberFormatException e) {
                System.out.print("输入格式错误，请重新输入数字选项: ");
            }
        }
    }

    // 拆分原功能1：工厂创建农机
    private static void initMachine() {
        System.out.println("\n[执行初始化]");
        MachineFactory factory = new PlanterFactory();
        planter = factory.createMachine();
        planter.monitorStatus();
    }

    // 拆分原功能2：环境监测通知
    private static void environmentMonitorDemo() {
        if (planter == null) {
            System.out.println("请先初始化农机（选择选项1）");
            return;
        }
        System.out.println("\n[执行环境监测]");
        EnvironmentMonitor monitor = new EnvironmentMonitor();
        monitor.addObserver(planter);
        monitor.notifyObservers("土壤湿度85%（过高）");
    }

    // 拆分原功能3：动态路径规划（保持原有逻辑）
    private static void pathPlanningDemo() {
        System.out.println("\n[执行路径规划]");
        PathStrategy normalStrategy = new NormalPathStrategy();
        PathStrategy avoidStrategy = new ObstacleAvoidanceStrategy();
        System.out.println("[路径规划] " + normalStrategy.calculatePath());
        System.out.println("[路径规划] " + avoidStrategy.calculatePath());
    }

    // 拆分原功能4：安全事件处理链（保持原有逻辑）
    private static void safetyChainDemo() {
        System.out.println("\n[执行安全事件处理]");
        SafetyHandler obstacleHandler = new ObstacleHandler();
        SafetyHandler faultHandler = new FaultHandler();
        obstacleHandler.setNext(faultHandler);

        obstacleHandler.handle("检测到前方2米障碍物");
        obstacleHandler.handle("发动机温度95℃（超阈值）故障");
    }

    // 拆分原功能5：状态切换演示（保持原有逻辑）
    private static void stateSwitchDemo() {
        if (planter == null) {
            System.out.println("请先初始化农机（选择选项1）");
            return;
        }
        System.out.println("\n[执行状态切换]");
        MachineState workingState = new WorkingState();
        workingState.start(planter);
        workingState.stop(planter);
    }

    // 拆分原功能6：发送控制命令（保持原有逻辑）
    private static void controlCommandDemo() {
        if (planter == null) {
            System.out.println("请先初始化农机（选择选项1）");
            return;
        }
        System.out.println("\n[执行控制命令]");
        MoveCommand moveCmd = new MoveCommand(planter);
        moveCmd.execute();
    }
    // 拆分原功能7：发送控制命令（保持原有逻辑）
    private static void show() {
        while (true) {  // 新增：菜单循环
            printMenu2();
            int choice2 = getValidChoice(new Scanner(System.in));  // 处理用户输入
            switch (choice2) {
                case 1:
                    show1model();
                    break;
                case 2:
                    show2model();                    break;
                case 3:
                    show3model();
                    break;
                case 4:
                    show4model();
                    break;
                case 5:
                    show5model();
                    break;
                case 6:
                    show6model();
                    break;
                case 0:
                    System.out.println("程序已退出");
                    return;
                default:
                    System.out.println("无效输入，请重新选择");
            }
        }


    }

    private static void show6model() {
        System.out.println("MoveCommand,execute,executeTask,AgriculturalMachine 都属于命令模式");

    }

    private static void show5model() {
        System.out.println("WorkingState,IdleState,start,stop,MachineState 都属于状态模式");
    }

    private static void show4model() {
        System.out.println("SafetyHandler,FaultHandler,ObstacleHandler,handle 都属于责任链模式");
    }

    private static void show3model() {
        System.out.println("NormalPathStrategy,ObstacleAvoidanceStrategy,calculatePath,PathStrategy 都属于策略模式");
    }

    private static void show2model() {
        System.out.println("EnvironmentMonitor,EnvironmentMonitor,notifyObservers,Machine,Planter 都属于观察者模式");
    }

    private static void show1model() {
        System.out.println("AgriculturalMachine ,AgriculturalMachine ,executeTask,MachineFactory ,PlanterFactory 都属于工厂方法模式");

    }

    private static void printMenu2() {
        String[] patterns = {
                "=== 设计模式展示 ===",
                "输入1-6查看详情，0退出",
                "1. 工厂方法模式（创建农机设备）",
                "2. 观察者模式（环境监测通知）",
                "3. 策略模式（路径规划）",
                "4. 责任链模式（安全事件处理）",
                "5. 状态模式（农机状态管理）",
                "6. 命令模式（远程控制指令）"

        };

        for (String pattern : patterns) {
            System.out.println(pattern);
        }
    }


}